/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package zonasoft.Manejadores;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import zonasoft.Conceptos.Lider;
import zonasoft.Conceptos.Zonificados;

/**
 *
 * @author JORGE
 */
public class ManejadorLider {

    public static Connection con;
    public static Connection conm;
    Conexion c = new Conexion();
    ManejadorBaseDatos mb = ManejadorBaseDatos.getInstancia();
    Connection cond = c.conectar();
    LinkedList lista = new LinkedList();

    /**Consulta de una eleccion por su id
     */
    public static Lider getLider(String idLider) throws SQLException {
        if (idLider == null) {
            throw new SQLException("no hay elemento clave en la clase Lider");
        }

        ResultSet rs = null;
        PreparedStatement pst = null;
        Lider lider = null;
        List<Zonificados> misZonificados = new ArrayList<Zonificados>();
        try {
            pst = conm.prepareStatement("select * from lider where idLider = ?");
            pst.setString(1, idLider.trim());
            rs = pst.executeQuery();
            while (rs.next()) {
                lider = Lider.load(rs);
            }
            rs = null;

            pst = conm.prepareStatement("select * from zonificados zo where idlider = ?");
            pst.setString(1, idLider.trim());
            rs = pst.executeQuery();
            if (lider != null && rs != null) {
//           System.out.println("Entro aca al mis zonificados");
                while (rs.next()) {
                    Zonificados zonificado = new Zonificados();
                    zonificado.setIdZonificado(rs.getString(1));
                    zonificado.setIdLider(rs.getString(3));
                    zonificado.setIdPuesto(rs.getString(4));
                    zonificado.setNombres(rs.getString(5));
                    zonificado.setApellidos(rs.getString(6));
                    zonificado.setFechadeNacimiento(rs.getDate(7));
                    zonificado.setCorreo(rs.getString(8));
                    zonificado.setTelefono(rs.getString(9));
                    zonificado.setDireccion(rs.getString(11));
                    zonificado.setCargo(rs.getString(12));
                    zonificado.setNumeroMesa(rs.getString(13));

                    misZonificados.add(zonificado);
                }

                lider.setZonificados(misZonificados);
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            if (rs != null) {
                rs.close();
            }
            if (pst != null) {
                pst.close();
            }
            return lider;
        }
    }// fin del getEleccion

    public static void crearLider(Lider li) throws SQLException {
        if (conm == null) {
            throw new SQLException("no hay conexion");
        }
        PreparedStatement pst = null;
        try {
            pst = conm.prepareStatement("insert into lider values (?,null,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
            pst.setString(1, li.getIdLider());
//pst.setString(2,null);
            pst.setString(2, li.getIdPuesto());
            pst.setString(3, li.getNombre());
            pst.setString(4, li.getApellido());
            java.sql.Date fechaN = new java.sql.Date(li.getFechaNacimiento().getTime());
            pst.setDate(5, fechaN);
            pst.setString(6, li.getCorreo());
            pst.setString(7, li.getTelefono());
            pst.setString(8, li.getBarrio());
            pst.setString(9, li.getDireccion());
            pst.setString(10, li.getCargo());
            pst.setString(11, li.getMesa());
            pst.setInt(12, li.getSexo());
            java.sql.Date fechaC = new java.sql.Date(li.getFechaCreacion().getTime());
            pst.setDate(13, fechaC);

            pst.setString(14, li.getIdUsuario());
            pst.setString(15, li.getComite());
            pst.setString(16, li.getIdPuestoCoordinado());
            pst.executeUpdate();

            for (String ca : li.getIdCandidatos()) {
                if(!ca.equals("0"))
                {
                 pst = conm.prepareStatement("insert into candidato_lider values (null,?,?)");
                 pst.setInt(1, Integer.parseInt(ca));
                 pst.setInt(2,Integer.parseInt(li.getIdLider()));
                    pst.executeUpdate();
                }
            }
           

        } finally {
            if (pst != null) {
                pst.close();
            }
        }
    }// fin de la clase crear eleccion

    public static boolean ModificarLider(Lider li, String idLider) throws SQLException {
//System.out.println( "sssss"+idLider);
        if (getLider(idLider) == null) {
            throw new SQLException("Lider Registrado");

        }
        PreparedStatement pst = null;
        boolean res = false;
        try {
            pst = con.prepareCall("update lider set idLider=?,"
                    + " nombre=?, apellido=?, fechaNacimiento=?, correo=?,telefono=?,direccion=?, sexo = ?, cargo = ?, "
                    + "barrio = ? ,idPuesto = ?,mesa = ?,comite_coordinado = ?,id_puestoCoordinado = ? where idlider = ?");

            pst.setString(1, li.getIdLider());
            pst.setString(2, li.getNombre());
            pst.setString(3, li.getApellido());
            java.sql.Date fechaNacimiento = new java.sql.Date(li.getFechaNacimiento().getTime());
            pst.setDate(4, fechaNacimiento);
            pst.setString(5, li.getCorreo());
            pst.setString(6, li.getTelefono());
            pst.setString(7, li.getDireccion());
            pst.setInt(8, li.getSexo());
            pst.setString(9, li.getCargo());
            pst.setString(10, li.getBarrio());
            pst.setString(11, li.getIdPuesto());
            pst.setString(12, li.getMesa());
            pst.setString(13, li.getComite());
            pst.setString(14, li.getIdPuestoCoordinado());
            pst.setString(15, idLider);


            int r = pst.executeUpdate();

            if (r != 0) {
                res = true;
            }
        } finally {
            if (pst != null) {
                pst.close();
            }
        }
        return res;

    }// fin de la clase modificar eleccion

    public static Collection listarLideres() throws Exception {
        try {
            Collection<Lider> lid = new ArrayList<Lider>();
            // String sentencia = "Select * from Usuario";
            String sentencia = "Select * from lider";
            ManejadorBaseDatos mbd = ManejadorBaseDatos.getInstancia();
            mbd.conectar();
            PreparedStatement pstmt = (PreparedStatement) mbd.crearSentencia(sentencia);
            ResultSet filasBD = mbd.consultaFilas(pstmt);
            while (filasBD.next()) {
                Lider li = Lider.load(filasBD);
                lid.add(li);
            }
            return lid;
        } catch (Exception ex) {
            // Logger.getLogger(ManejadorSimpatizante.class.getName()).log(Level.SEVERE, null, ex);
            throw new Exception("Resultado Negativo de la Base de Datos " + ex.getMessage());
        }
    }

    public static boolean updateLiderDeshabilitar(Lider lid, String IdLider, int flag) throws SQLException {
        if (getLider(IdLider) == null) {
            throw new SQLException("lider no registrado");
        }
        PreparedStatement pst = null;
        con.setAutoCommit(false);

        Statement st1 = conm.createStatement();
        boolean res = false;
        try {
            pst = conm.prepareStatement("Update usuario set idLider =? where idLider=?");
            String lider = lid.getIdLider();
            if (flag == 0) {
                lider += "_";
            } else {
                if (flag == 1) {
                    lider = lider.replace("_", "");
                }
            }
            pst.setString(2, lid.getIdLider());
            pst.setString(1, lider);
            int r = pst.executeUpdate();


            if (r != 0) {
                res = true;
            }
        } finally {
            if (pst != null) {
                pst.close();
            }
        }
        return res;
    }

    public static int cantidadLideres() throws SQLException {
        ResultSet rs = null;
        PreparedStatement pst = null;

        int numeroLideres = 0;

        String consulta = (" select count(*) from lider");

        try {
            pst = con.prepareStatement(consulta);
            rs = pst.executeQuery();

            while (rs.next()) {
                numeroLideres = rs.getInt(1);
            }
        } finally {
            if (rs != null) {
                rs.close();
            }
            if (pst != null) {
                pst.close();
            }
        }
        return numeroLideres;
    }

    public static Map<String, String> getDatosVotacion(String idPuesto) throws SQLException, Exception {
//     System.out.println("Consultando datos de votacio...... ");
        ResultSet rs = null;
        PreparedStatement pst = null;
        Map<String, String> resultado = new HashMap<String, String>();
        try {
            pst = conm.prepareStatement("SELECT puestodevotacion.nombre as 'puesto'"
                    + " , barrio.nombre as 'barrio'"
                    + " , municipios.nombre as 'municipio'"
                    + " , departamentos.nombre as 'departamento'"
                    + "FROM "
                    + " zonificacion.puestodevotacion "
                    + " INNER JOIN zonificacion.barrio "
                    + " ON (puestodevotacion.idbarrio = barrio.idBarrio) "
                    + " INNER JOIN zonificacion.zona "
                    + " ON (puestodevotacion.idZona = zona.codigo) "
                    + " INNER JOIN zonificacion.municipios "
                    + " ON (zona.idmunicipio = municipios.codigo) "
                    + " INNER JOIN zonificacion.departamentos "
                    + "  ON (municipios.cod_departamentos = departamentos.codigo) "
                    + "WHERE puestodevotacion.idpuesto_votacion = ? ");

            pst.setString(1, idPuesto.trim());

            rs = pst.executeQuery();

            while (rs.next()) {
//                System.out.println("rs es diferente de null");
                resultado.put("puesto", rs.getString(1));
                resultado.put("barrio", rs.getString(2));
                resultado.put("municipio", rs.getString(3));
                resultado.put("departamento", rs.getString(4));
            }
        } catch (SQLException ex) {
            ex.printStackTrace();
        } finally {
            if (rs != null) {
                rs.close();
            }
            if (pst != null) {
                pst.close();
            }
            return resultado;
        }
    }

    public static Object[] validarZonificacion(String b1, String b2) throws SQLException, Exception {
        ResultSet rs = null;
        PreparedStatement pst = null;
        boolean respuesta = false;
        Object[] resultado = new Object[3];
        int[] unidades = new int[2];
//        System.out.println("b1f = "+b1+" b2f ="+b2);
        Map<String, Integer> unidadesMap = new HashMap<String, Integer>();

        b1 = (b1 != null && !b1.isEmpty()) ? b1 : "barrio1";//operador ternario
        b2 = (b2 != null && !b2.isEmpty()) ? b2 : "barrio2";//operador ternario
        try {

            if (!b1.trim().equals(b2.trim())) {
//                  System.out.println("b1 = "+b1+" b2 ="+b2);
                pst = conm.prepareStatement("SELECT udegobierno.codigo,barrio.nombre "
                        + " FROM zonificacion.barrio"
                        + " INNER JOIN zonificacion.udegobierno "
                        + " ON (barrio.iducdg = udegobierno.codigo) "
                        + " where barrio.nombre = ? OR barrio.nombre = ? ");
                pst.setString(1, b1.trim());
                pst.setString(2, b2.trim());
                rs = pst.executeQuery();
                int i = 0;
                while (rs.next()) {
                    resultado[i] = rs.getInt(1);
                    unidadesMap.put(rs.getString(2).toLowerCase(), rs.getInt(1));
                    unidades[i] = rs.getInt(1);
                    i++;
                }
//                System.out.println(unidades[0] + " = " + unidades[1]);
                if (unidades[0] != unidades[1]) {
                    respuesta = false;
                } else {
                    respuesta = true;
                }
                resultado[0] = unidadesMap;
                resultado[1] = respuesta;
                resultado[2] = 0;
            } else {
//                  System.out.println("b1in = "+b1+" b2in ="+b2);
                pst = conm.prepareStatement("SELECT udegobierno.codigo,barrio.nombre "
                        + " FROM zonificacion.barrio"
                        + " INNER JOIN zonificacion.udegobierno "
                        + " ON (barrio.iducdg = udegobierno.codigo) "
                        + " where barrio.nombre= ?  ");
                pst.setString(1, b1.trim());
                rs = pst.executeQuery();
                respuesta = true;
                resultado[0] = new HashMap<String, Integer>();
                resultado[1] = respuesta;
                while (rs.next()) {
                    resultado[2] = rs.getInt(1);
                }

//                System.out.println("resultado[2] = " + resultado[2]);

            }


        } catch (SQLException ex) {
            ex.printStackTrace();
        } finally {
            if (rs != null) {
                rs.close();
            }
            if (pst != null) {
                pst.close();
            }
            return resultado;
        }
    }

    public static List<String> misNovedades(int id) throws SQLException, Exception {
        ResultSet rs = null;
        PreparedStatement pstmt = null;
        String sentencia = "select  li.nombre,CONCAT(z.nombre,' ',z.apellido) as zonificado, n.descripcion from lider li, novedad n, zonificados z where li.idlider = n.idlidernuevo and z.idzonificados = n.idzonificados and li.idlider = " + id;
        try {
            List<String> no = new ArrayList<String>();
            pstmt = (PreparedStatement) conm.prepareStatement(sentencia);
            rs = pstmt.executeQuery();
            while (rs.next()) {
                String novedad = rs.getString(1) + "," + rs.getString(2) + "," + rs.getString(3);
                no.add(novedad);
            }
            return no;
        } catch (Exception ex) {
            ex.printStackTrace();
            throw new Exception("Resultado negativo de la base de datos" + ex.getMessage());
        }

    }
}// fin de la clase Manejadora

